package com.mikufufu.blog.common.entity;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 一个改进后的Node类，提供了更安全、更易于维护的结构。
 * 对于泛型T和E，建议子类在使用时确保类型安全。
 * 这个类是线程不安全的，如果需要在多线程环境中使用，请在子类中实现适当的同步机制。
 *
 * 
 * @param <T> 节点类型标识，用于区分不同类型的节点
 * @param <E> 父节点标识类型，确保与节点类型区分，避免数据一致性问题
 */
@Data
public abstract class Node<T, E> {

    @ApiModelProperty(value = "节点ID")
    private E id;

    @ApiModelProperty(value = "父节点ID")
    private E parentId;

    @ApiModelProperty(value = "子节点列表")
    private List<Node<T, E>> children = Collections.synchronizedList(new ArrayList<>());

    /**
     * 添加一个子节点。
     * @param child 要添加的子节点。
     * @return 如果添加成功，返回true；如果子节点已存在，返回false。
     */
    public boolean addChild(Node<T, E> child) {
        return children.add(child);
    }

    /**
     * 移除一个子节点。
     * @param child 要移除的子节点。
     * @return 如果成功移除，返回true；如果子节点不存在，返回false。
     */
    public boolean removeChild(Node<T, E> child) {
        return children.remove(child);
    }
}

